package model.materiasYCatedras;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.Observable;
import java.util.Observer;

import model.alumnos.AlumnoEnCarrera;
import model.tps.EntregaTpPorAlumno;
import model.tps.Tp;

/**
 * La idea principal de esta clase es adaptar un AlumnoEnCarrera 
 * a que pase a ser un AlumnoEnCatedra y asi guardar las notas y 
 * los ausentes que posee.
 * 
 * Por lo cual es necesario que cuando se inscribe un alumno a la catedra
 * Se instancie un AlumnoEnCatedra y se guarde dentro de la planilla que 
 * tiene la catedra
 * 
 *  
 * @author Martin
 *
 */
public class AlumnoEnCatedra implements Observer {
	private AlumnoEnCarrera alumno;
	private List<Integer> notas = new ArrayList<Integer>();
	private List<String> ausentes = new ArrayList<String>();
	private Catedra catedra;
	private Map<Tp, EntregaTpPorAlumno> entregasDeTp = new HashMap<Tp, EntregaTpPorAlumno>();
	
	/// Constructor ///
	
	public AlumnoEnCatedra(AlumnoEnCarrera alumno, Catedra catedra){
		this.setAlumno(alumno);
		this.setCatedra(catedra);	
	}
	
	public AlumnoEnCatedra(){
		
	}
	
	///////////////////

	/// Getters && Setters ///
	
	public Catedra getCatedra() {
		return catedra;
	}

	public void setCatedra(Catedra catedra) {
		this.catedra = catedra;
	}

	public AlumnoEnCatedra(AlumnoEnCarrera unAlumno){
		this.setAlumno(unAlumno);
	}
	
	public AlumnoEnCarrera getAlumno() {
		return alumno;
	}

	public void setAlumno(AlumnoEnCarrera alumno) {
		this.alumno = alumno;
	}

	public List<Integer> getNotas() {
		return notas;
	}

	public void setNotas(List<Integer> notas) {
		this.notas = notas;
	}

	public List<String> getAusentes() {
		return ausentes;
	}

	public void setAusentes(List<String> ausentes) {
		this.ausentes = ausentes;
	}
	
	
	/// Datos Personales ////
	
	public String getNombre(){
		return this.getAlumno().getNombre();
	}
	
	public String getApellido(){
		return this.getAlumno().getApellido();
	}
	
	public String getTelefono(){
		return this.getAlumno().getTelefono();
	}
	
	public String getSexo(){
		return this.getAlumno().getSexo();
	}
	
	public String getEstadoCivil(){
		return this.getAlumno().getEstadoCivil();
	}
	
	public String getCelular(){
		return this.getAlumno().getCelular();
	}
	
	public String getEMail(){
		return this.getAlumno().getEMail();
	}

	public Map<Tp, EntregaTpPorAlumno> getEntregasDeTp() {
		return entregasDeTp;
	}
	
	public void setEntregasDeTp(Map<Tp, EntregaTpPorAlumno> entregasDeTp) {
		this.entregasDeTp = entregasDeTp;
	}
	
	////
	
	/// Fin Getters && Setters ///
	/**
	 * El AlumnoEnCatedra guarda las notas
	 * por lo cual se le pueden agregar Notas
	 * cuando uno quiera hacerlo para luego
	 * poder calcular el promedio.
	 *  
	 * @param nota
	 */
	
	public void cargarNota(int nota){
		this.getNotas().add(nota);
	}
	
	public void cargarAusente(){
		SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
		this.getAusentes().add(dateFormat.format(Calendar.getInstance().getTime()));
	}
	
	/**
	 * Este metodo se encarga de recorrer
	 * la lista de notas del alumno y devolver
	 * el promedio.
	 * 
	 * @return
	 */
	
	public double promedio(){
		
		// TODO: Si no tiene notas se rompe
		double sumaDeNotas = 0;
		for (int nota : this.getNotas()){
			sumaDeNotas = sumaDeNotas + nota;
		}
		
		return sumaDeNotas / this.getNotas().size();
	}
	
	public int cantidadDeAusentes(){
		return this.getAusentes().size();
	}
	
	public void agregarTpYNota(Tp tp, Integer nota){
		this.getEntregasDeTp().put(tp, new EntregaTpPorAlumno(tp,this, nota, GregorianCalendar.getInstance()));
		tp.cargarEntrega(this, nota);
	}

	public Boolean aproboUnTp(Tp unTp){
		return this.getEntregasDeTp().get(unTp).getNota() > 6;
	}
	
	public Integer notaEnTp(Tp unTp){
		return this.getEntregasDeTp().get(unTp).getNota();
	}
	
	public EntregaTpPorAlumno getEntrega(Tp tp){
		return this.getEntregasDeTp().get(tp);
	}
	
	
	// OBSERVER
	@Override
	public void update(Observable o, Object arg) {
		// No hace nada ya que los horarios los conoce la catedra
		// el alumno solo sabe en que catedras esta anotado
		
	}	
	////	
}

